package com.fjl.stack.leetcode388;

import java.util.Deque;
import java.util.LinkedList;

/**
 * @Description
 * @Author: 01195
 * @Date: 2025/4/22 10:40
 */
/*
如果是代码表示，上面的文件系统可以写为 "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext" 。'\n' 和 '\t' 分别是换行符和制表符。
示例 1：
    输入：input = "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext"
    输出：20
    解释：只有一个文件，绝对路径为 "dir/subdir2/file.ext" ，路径长度 20
示例 2：
    输入：input = "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext"
    输出：32
    解释：存在两个文件：
    "dir/subdir1/file1.ext" ，路径长度 21
    "dir/subdir2/subsubdir2/file2.ext" ，路径长度 32
    返回 32 ，因为这是最长的路径
示例 3：
    输入：input = "a"
    输出：0
    解释：不存在任何文件
示例 4：
    输入：input = "file1.txt\nfile2.txt\nlongfile.txt"
    输出：12
    解释：根目录下有 3 个文件。
    因为根目录中任何东西的绝对路径只是名称本身，所以答案是 "longfile.txt" ，路径长度为 12
 */
public class Clazz {
    public int lengthLongestPath(String input) {
        // 这个栈存储之前的父路径。实际上这里只用存父路径的长度就够了，这个优化留给你吧
        Deque<String> stack = new LinkedList<>();
        int maxLen = 0;
        for (String part : input.split("\n")) {
            int level = part.lastIndexOf("\t") + 1;
            // 让栈中只保留当前目录的父路径
            while (level < stack.size()) {
                stack.removeLast();
            }
            stack.addLast(part.substring(level));
            // 如果是文件，就计算路径长度
            if (part.contains(".")) {
                int sum = stack.stream().mapToInt(String::length).sum();
                // 加上父路径的分隔符
                sum += stack.size() - 1;
                maxLen = Math.max(maxLen, sum);
            }
        }
        return maxLen;
    }

    public static void main(String[] args) {
        String s = "dir\n\tsubdir1\n\t\tfile1.ext\n\t\tsubsubdir1\n\tsubdir2\n\t\tsubsubdir2\n\t\t\tfile2.ext";
        System.out.println(new Clazz().lengthLongestPath(s));
    }
}
